package com.gxa.hotel.admin.controller;



import com.gxa.hotel.admin.config.ClientConfig;
import com.gxa.hotel.core.common.JsonResult;
import com.qcloud.cos.model.ObjectMetadata;
import com.qcloud.cos.model.PutObjectRequest;
import com.qcloud.cos.model.UploadResult;
import com.qcloud.cos.transfer.TransferManager;
import com.qcloud.cos.transfer.Upload;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.Map;
import java.util.UUID;

/**
 * MultipartFile 是SpringMVC封装的接收前端的文件的对象,会被直接注入到参数中
 *  同时利用该对象的transferTo(File)
 *
 * 在参数中还自动注入了HTTPServletRequest对象,目的是为了获取服务器的根路径(realPath),被swagger忽略
 * @author
 * @date 2022/6/1 10:12
 */

@RestController
public class UploadController {

    
    @Autowired
    ClientConfig clientConfig;
    @Autowired
    TransferManager transferManager;

    @PostMapping("/upload")
    public Map upload(@RequestPart("file") MultipartFile multipartFile,
                      HttpServletRequest request) throws Exception {
//QQ截图20200724153059.png
        String originalFilename = multipartFile.getOriginalFilename();
        System.out.println("originalFilename:"+originalFilename);
// 从原始文件名中获取后缀,作为新添加的文件的文件名后缀(匹配)
        String subfix =
                originalFilename.substring(originalFilename.indexOf(".")+1);
        System.out.println("subfix:"+subfix);
//使用UUID作为文件名,保证服务器中存放的文件名唯一
        String targetFile = UUID.randomUUID().toString().replace("- ","")+"."+subfix;
                System.out.println("targetFile:"+targetFile);
// 通过request获取当前程序的根路径"/"
        String path =
                request.getSession().getServletContext().getRealPath("/");
        System.out.println(path);
//        path="D:";
        String fileName = targetFile;
        System.out.println("fileName:"+fileName);
// 构建文件对象
//        File uploadFile = new File(fileName);
//核心操作(含有异常操作, 利用异常设定状态码(和前端约定)
// 此处应当和ExceptionController结合, 当try执行成功则设定状态码0
// 出现异常则设定其他
// 再将异常信息结合BusinessException抛出, 交给ExceptionController处理

        try {
// 使用高级接口必须先保证本进程存在一个 TransferManager 实例，如果没有则创建
// 详细代码参见本页：高级接口 -> 创建 TransferManager


// 存储桶的命名格式为 BucketName-APPID，此处填写的存储桶名称必须为此格式
            String bucketName = "15967478284-1312552200";
// 对象键(Key)是对象在存储桶中的唯一标识。
            String key = "/image/"+fileName;

// 这里创建一个 ByteArrayInputStream 来作为示例，实际中这里应该是您要上传的 InputStream 类型的流
            long inputStreamLength = 1024 * 1024;
            byte[] data = multipartFile.getBytes();
            InputStream inputStream = new ByteArrayInputStream(data);
//            InputStream inputStream = multipartFile.getInputStream();
            ObjectMetadata objectMetadata = new ObjectMetadata();
// 上传的流如果能够获取准确的流长度，则推荐一定填写 content-length
// 如果确实没办法获取到，则下面这行可以省略，但同时高级接口也没办法使用分块上传了
            objectMetadata.setContentLength(multipartFile.getBytes().length);

            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, inputStream, objectMetadata);


                // 高级接口会返回一个异步结果Upload
                // 可同步地调用 waitForUploadResult 方法等待上传完成，成功返回UploadResult, 失败抛出异常
                Upload upload = transferManager.upload(putObjectRequest);
                UploadResult uploadResult = upload.waitForUploadResult();


// 确定本进程不再使用 transferManager 实例之后，关闭之
// 详细代码参见本页：高级接口 -> 关闭 TransferManager
//            clientConfig.shutdownTransferManager(transferManager);

//            multipartFile.transferTo(uploadFile);


        } catch (Exception e) {
//e.printStackTrace();
            throw e;
        }
        JsonResult jsonResult = new JsonResult();
// 返回状态:1 表示上传成功
        jsonResult.setCode("200");
        jsonResult.setMsg("上传成功");
// 返回服务器保存后的文件名
        jsonResult.set("fileName",targetFile);
        return jsonResult.getMap();
    }


}